EFSを利用するECSタスクの起動が失敗する場合の対処法を紹介
今回のテーマ
こんにちはAWS事業本部コンサルティング部のこーへいです。
今回のテーマは「EFSを利用するECSでのタスク起動失敗に対する対処方法」です。
背景
今回は上記の通り非常にシンプルな構成にてECSとEFSを利用するケースを想定しています。
EFSにindex.htmlを格納しており、起動したタスクはEFSのindex.htmlを読み込んで以下のようにページを表示します。
上記のような構成でタスクを起動したところ以下のようなエラーが発生し、タスク起動が失敗してしまいました。
Resourceinitializationerror: failed to invoke EFS utils commands to set up EFS volumes: stderr: Failed to resolve "EFSのDNSホスト名" - check that your file system ID is correct, and ensure that the VPC has an EFS mount target for this file system ID. See https://docs.aws.amazon.com/console/efs/mount-dns-name for more detail. Attempting to lookup mount target ip address using botocore. Failed to import necessary dependency botocore, please install botocore first. : unsuccessful EFS utils command execution; code: 1
結論
VPCの設定にてDNSホスト名が無効化されているのが原因です。
併せてSGやIAMロールの設定に関してもお話しさせてください。
DNSホスト名を有効化する
解決方法としては至ってシンプルでVPCの管理画面から上記の赤枠部分にて設定を変更するだけです。
Amazon Route 53 Resolver サーバーは、Amazonが提供するプライベートDNSホスト名を解決できます。
上記の公式ドキュメントにも記載されていますがDNSホスト名が有効化されていないと、プライベートDNSホスト名とIPアドレスの名前解決が行えません。なのでエラー文にも出ているように、EFSのDNSホスト名とIPアドレスの名前解決が行えずエラーが発生したということですね。
ちなみに有効化してから数分程度待って、タスク起動を行うと、、、
無事起動が完了しました!
SGを確認する
他の原因として考えられそうなSGの設定ですが、EFSのマウントターゲットにセットされているSGのインバウンドルールを削除して、ECSタスク⇄EFSマウントターゲット間の通信を閉じて検証してみました。
Resourceinitializationerror: failed to invoke EFS utils commands to set up EFS volumes: stderr: Mount attempt 1/3 failed due to timeout after 15 sec, wait 0 sec before next attempt. Mount attempt 2/3 failed due to timeout after 15 sec, wait 0 sec before next attempt. b'mount.nfs4: Connection reset by peer' : unsuccessful EFS utils command execution; code: 32
というエラーが発生しタスクが落ちてしまいました。ECSタスク⇄EFSマウントターゲット間の通信が閉じられためEFSボリュームをセットアップ出来なかったとのことです。
ちなみに既に稼働している状態にて、SGの設定変更を行なって通信を閉じたところタスクは稼働し続けました(Running状態)がEFSにはアクセスできませんでした。この仕様も把握しておけば障害調査の際に役立ちそうなのでメモしておきます。
IAMロールは?
ECSのタスクロールやタスク実行ロールにEFSに関する権限設定は必要なさそうです。
実際にEFSに関する権限がないECSのタスクロールやタスク実行ロールで起動してみましたが、特に問題なくタスク起動が行われindex.htmlが表示されました。
まとめ
初めてEFSを利用したので上記の問題解決に2時間ほど沼ってしまいました。
この検証がどなたかの役に立てば幸いです。